package br.org.acessobrasil.portal.persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.org.acessobrasil.portal.modelo.Formato;
import br.org.acessobrasil.portal.modelo.InformacaoTipoConteudo;
import br.org.acessobrasil.portal.util.MySqlConnection;

/**
 * 
 * @author Fabio Issamu Oshiro
 */
public class InformacaoTipoConteudoDao extends SuperDao<InformacaoTipoConteudo> {
	
	private static InformacaoTipoConteudoDao instance;
	
	public InformacaoTipoConteudoDao() {
		instance = this;
	}
	
	/**
	 * Conta quantos conteudos formatados existem para este Tipo de Informacao
	 * @param nu_informacao_tipo_conteudo
	 * @return total de conteudo formatado
	 */
	public int getTotalConteudoFormatado(long nu_informacao_tipo_conteudo) throws Exception{
		//TODO Utilizar o Em
		int res=0;
		Connection con = MySqlConnection.getConnection();
		PreparedStatement ps = con.prepareStatement("Select count(*)as total From sgctb_conteudo_formatado where not de_conteudo like '' and nu_informacao_tipo_conteudo=?");
		ps.setLong(1, nu_informacao_tipo_conteudo);
		ResultSet rs = ps.executeQuery();
		if(rs.next()){
			res = rs.getInt("total");
		}
		con.close();
		return res;
	}
	public List<InformacaoTipoConteudo> getListInformacao(Long nu_tipo_conteudo) throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException{
		//TODO Utilizar o Em
		Connection con = MySqlConnection.getConnection();
		List<InformacaoTipoConteudo> arrInformacaoTipoConteudo=getListInformacao(nu_tipo_conteudo,con);
		con.close();
		return arrInformacaoTipoConteudo;
	}

	public List<InformacaoTipoConteudo> getListInformacao(Long nu_tipo_conteudo, Connection con) throws SQLException {
		//TODO Utilizar o Em
		ArrayList<InformacaoTipoConteudo> arrInformacaoTipoConteudo = new ArrayList<InformacaoTipoConteudo>();
		PreparedStatement ps = con.prepareStatement("Select I.nu_ordem,I.de_dica_preenchimento,F.nu_formato,F.no_formato,I.no_informacao,I.no_tag, I.nu_informacao_tipo_conteudo,I.nu_tipo_conteudo,I.co_ativo From sgctb_informacao_tipo_conteudo as I inner join sgctb_formato as F on I.nu_formato=F.nu_formato where I.nu_tipo_conteudo = ? order by nu_ordem");
		ps.setLong(1, nu_tipo_conteudo);
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			InformacaoTipoConteudo info = new InformacaoTipoConteudo();
			info.setDeDicaPreenchimento(rs.getString("de_dica_preenchimento"));
			info.setNoInformacao(rs.getString("no_informacao"));
			info.setNoTag(rs.getString("no_tag"));
			info.setNuFormato(rs.getInt("nu_formato"));
			info.setNuInformacaoTipoConteudo(rs.getLong("nu_informacao_tipo_conteudo"));
			info.setNuOrdem(rs.getInt("nu_ordem"));
			info.setCoAtivo(rs.getBoolean("co_ativo"));
			info.setNuTipoConteudo(rs.getLong("nu_tipo_conteudo"));
			
			Formato formato = new Formato();
			formato.setNoFormato(rs.getString("no_formato"));
			formato.setNuFormato(rs.getInt("nu_formato"));
			formato.setClassName(this.getClassName(rs.getInt("nu_formato")));
			info.setFormato(formato);
			
			arrInformacaoTipoConteudo.add(info);
		}
		rs.close();
		ps.close();
		return arrInformacaoTipoConteudo;
	}
	private String getClassName(int nu_formato){
		switch(nu_formato){
		case 2: return "java.lang.Integer";		
		case 4: return "java.sql.Date";
		default:
				return "java.lang.String";
		}
	}
	public void apagar(long nu_informacao_tipo_conteudo) {
		//TODO Utilizar o Em
		Connection con = null;
		try {			
			con = MySqlConnection.getConnection();
			PreparedStatement ps;
			ps = con.prepareStatement("Delete From sgctb_conteudo_formatado where nu_informacao_tipo_conteudo = ?");
			ps.setLong(1, nu_informacao_tipo_conteudo);
			ps.execute();
			ps.close();
			ps = con.prepareStatement("Delete From sgctb_informacao_tipo_conteudo where nu_informacao_tipo_conteudo = ?");
			ps.setLong(1, nu_informacao_tipo_conteudo);
			ps.execute();
			ps.close();
		} catch (Exception e) {
			
		} finally {
			try{
				con.close();
			}catch(Exception e){
				
			}
		}
	}
	/**
	 * Organiza as ordens
	 * @param nu_tipo_conteudo
	 */
	public void organizaOrdem(long nu_tipo_conteudo) {
		//TODO Utilizar o Em
		Connection con = null;
		try {			
			con = MySqlConnection.getConnection();
			PreparedStatement psUpdate = con.prepareStatement("Update sgctb_informacao_tipo_conteudo set nu_ordem=? where nu_informacao_tipo_conteudo=?");
			PreparedStatement ps;
			ps = con.prepareStatement("Select nu_informacao_tipo_conteudo From sgctb_informacao_tipo_conteudo where nu_tipo_conteudo = ? order by nu_ordem");
			ps.setLong(1, nu_tipo_conteudo);
			ResultSet rs = ps.executeQuery();
			int c=1;
			while (rs.next()){
				psUpdate.setInt(1, c++);
				psUpdate.setLong(2,rs.getLong("nu_informacao_tipo_conteudo"));
				psUpdate.execute();
			}
			rs.close();
			ps.close();
		} catch (Exception e) {
			
		} finally {
			try{
				con.close();
			}catch(Exception e){
				
			}
		}
	}
	
	
	public static InformacaoTipoConteudoDao getInstance() {
		return instance;
	}

	public static void setInstance(InformacaoTipoConteudoDao instance) {
		InformacaoTipoConteudoDao.instance = instance;
	}

	public InformacaoTipoConteudo select(Long id) throws Exception {
		return getEntityManager().find(InformacaoTipoConteudo.class, id);
	}
}
